package com.itheima.excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.itheima.excel.entity.OperationDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.ResourceUtils;

import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.util.*;

@SpringBootTest
@Slf4j
public class FillTemplate {

    /*
    * 复杂的填充
    * @since 2.1.1
    * */
    @Test
    public void complexFill() throws FileNotFoundException {
      //{} 代表普通变量 {.}代表的是list的变量、
        String templateFileName = ResourceUtils.getFile("classpath:excel/demo.xlsx").getAbsolutePath();
        String fileName =
                ResourceUtils.getFile("classpath:excel/运营数据报表模板2.xlsx").getAbsolutePath();
        // 方案1
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行，然后下面的数据往后移动。默认 是false，会直接使用下一行，如果没有则创建。
            // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了，所以慎用
            // 简单的说 如果你的模板有list,且list不是最后一行，下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
            // 如果数据量大 list不是最后一行 参照下一个
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

            //填充模板
            excelWriter.fill(data(),fillConfig, writeSheet);
            excelWriter.fill(data(),fillConfig,  writeSheet);

            //单个表格需要的数据
            HashMap<String, Object> map = MapUtils.newHashMap();
            map.put("beginTime",LocalDate.now().minusDays(5).toString());//开始时间
            map.put("endTime",LocalDate.now().toString());//结束时间
            map.put("turnover", 8888.88);  //营业额
            map.put("orderCompletionRate", 0.99); //订单完成率
            map.put("totalUser", 600); //新增用户数
            map.put("validOrderCount", 68); //有效订单数
            map.put("unitPrice", 196.28); //平均客单价
            map.put("total",999); //总计

            //填充模板
            excelWriter.fill(map,writeSheet);
        }catch (Exception e){
            log.error("模板填充失败");
            e.printStackTrace();
        }
    }

    //创建模拟数据，用于模板填充
    private List<OperationDTO> data() {
        ArrayList<OperationDTO> list = new ArrayList<>();
        Random random = new Random();
        for (int i = 1; i <= 5; i++) {
            OperationDTO operationDTO = OperationDTO.builder()
                    .date(LocalDate.now().toString())
                    .turnover(Double.valueOf(random.nextInt(1000) + ""))
                    .orderCompletionRate(Math.random())
                    .unitPrice(Double.valueOf(new DecimalFormat("#.0000").format(1000.0/i)))
                    .newUsers(random.nextInt(100)+1)
                    .build();
            list.add(operationDTO);
        }
        return list;
    }

    @Test
    public void getFilePath() throws UnsupportedEncodingException {
        System.out.println(this.getClass().getResource("/").getPath());
    }
}
